package com.kmxd.ams.infra.tmpl.util;

import cn.hutool.core.io.resource.ResourceUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.kmxd.ams.infra.tmpl.dto.JsonFieldDto;
import com.kmxd.ams.infra.tmpl.dto.RuleConfigBO;
import com.kmxd.ams.infra.tmpl.enums.TmplRes;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.TreeSet;
import java.util.stream.Collectors;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.compress.utils.Lists;
import org.springframework.stereotype.Component;

/**
 * 模板公共方法
 *
 * @author ZuoLG
 */
@Component
@Slf4j
@AllArgsConstructor
public class TmplCommon {
  /** 文件模板 */
  public static final TmplRes[] DOC = {
    TmplRes.system,
    TmplRes.vol_box_document_share,
    TmplRes.document_standard,
    TmplRes.doc_model_document
  };

  /** 文件+盒 */
  public static final TmplRes[] DOC_BOX = {
    TmplRes.system,
    TmplRes.vol_box_document_share,
    TmplRes.document_standard,
    TmplRes.doc_model_document,
    TmplRes.box_model_document
  };

  /** 文件 + 案卷 */
  public static final TmplRes[] DOC_VOL = {
    TmplRes.system,
    TmplRes.vol_box_document_share,
    TmplRes.document_standard,
    TmplRes.doc_model_document,
    TmplRes.vol_model_document
  };

  /** 项目 */
  public static final TmplRes[] PROJ = {TmplRes.system, TmplRes.project_standard};

  /** 盒 */
  public static final TmplRes[] BOX = {
    TmplRes.system, TmplRes.vol_box_document_share, TmplRes.box_standard,
  };

  /** 卷 */
  public static final TmplRes[] VOL = {
    TmplRes.system, TmplRes.vol_box_document_share, TmplRes.volume_standard
  };

  /** 电子文件 */
  public static final TmplRes[] EFILE = {TmplRes.efile};

  // TmplRes.box_model_document如果包含盒，需要加入到doc中
  // TmplRes.vol_model_document 如果包含案卷，需要加入到doc中

  /** 固定字段 */
  public List<JsonFieldDto> getField(TmplRes... list) {
    List<JsonFieldDto> fields = Lists.newArrayList();
    for (int i = 0; i < list.length; i++) {
      fields.addAll(
          JSONUtil.toList(ResourceUtil.readUtf8Str(list[i].getPath()), JsonFieldDto.class));
    }
    return fields.stream()
        .filter(item -> StrUtil.isNotBlank(item.getCode()))
        .collect(
            Collectors.collectingAndThen(
                Collectors.toCollection(
                    () -> new TreeSet<>(Comparator.comparing(JsonFieldDto::getCode))),
                ArrayList::new));
  }

  /** 固定字段 */
  public RuleConfigBO getConfig(TmplRes config) {
    return JSONUtil.toBean(ResourceUtil.readUtf8Str(config.getPath()), RuleConfigBO.class);
  }

  /**
   * 通过配置路径，拿到模版配置信息
   *
   * @param path 模版路径
   * @param clazz 模版类型
   * @param <T> 类型
   * @return
   */
  public <T> T getTempInfo(String path, Class<T> clazz) {
    return JSONUtil.toBean(ResourceUtil.readUtf8Str(path), clazz);
  }

  public <T> List<T> getTempInfoList(String path, Class<T> clazz) {
    return JSONUtil.toList(ResourceUtil.readUtf8Str(path), clazz);
  }
}
